# 语法： 浏览器对象.find_element(by=By.XPATH,value="xpath表达式")
# xpath定位分类：
# 绝对路径：
# 从最外层元素到指定元素之间所有经过的元素层级的路径 （层级关系依赖强，不建议使用）
# 写法：/html根节点开始，使用/来分隔元素层级。例
# 如： /html/body/div/fieldset/form/p[1]/input
# 相对路径：
# 从目标定位元素的任意层级的上级元素开始到目标元素所经过的层级的路径
# 写法：以 // 开始，后续每个层级都使用 / 来分隔。例如： //p[3]/input
# 路径+属性定位
# 利用元素的属性来定位
# 写法： //标签名[@属性名="属性值"] 或者 //*[@属性名="属性值"]
# //*[@属性名1="属性值" and @属性名2=属性值]
# 注意事项：标签名可以使用 * 来代替任意
# 1.导包（快捷键：alt + enter）
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
# 2.打开浏览器（创建浏览器驱动对象-定义驱动路径
path = r"D:\tools\drivers\chromedriver.exe"
# 实例化Chrome浏览器服务驱动
ser = Service(executable_path=path)
# 创建浏览器驱动
driver = webdriver.Chrome()
# 3.输入网址
driver.get("http://121.43.169.97:8848/pageA.html")
# 4.页面操作
# 属性定位：建议选择具有唯一性的属性
# driver.find_element(By.XPATH,"//input[@name='userA']").send_keys("admin")
# driver.find_element(By.XPATH,"//*[@id='passwordA']").send_keys("123456")
# 属性和逻辑结合
# driver.find_element(By.XPATH,"//*[@type='button' and @value='prompt']").click()
# 属性和逻辑结合
# 利用元素的多个属性来进行定位
# 写法： //*[@属性名="属性值" and @属性名="属性值"]
# 层级和属性结合
# 先定位到其父级元素，然后再找到该元素
# 写法： //标签名[@属性名="属性值"]/标签名[@属性名="属性值"]
# 4.页面操作：层级与属性定位
# 用户名
# driver.find_element(By.XPATH,"//p[@id='pa']/input[@type='text']").send_keys("admin")
# 密码
# driver.find_element(By.XPATH,"//p/input[@type='password']").send_keys("123456")
# 利用元素文本定位
# 写法： //*[text()="文本"]
# 页面操作:定位百度按钮-路径+文本：//*[text()="文本信息"]
# driver.find_element(by=By.XPATH, value="//*[text()='百度']").click()
# 【扩展】利用局部属性值定位
# 写法： //*[contains(@属性名,"局部属性值")]
# 放大浏览器
driver.maximize_window()
time.sleep(1)
# 模拟用户操作
# 获取用户名：包含部分属性值
driver.find_element(By.XPATH, "//*[contains(@placeholder,'用户名')]").send_keys("admin")
time.sleep(3)
# 点击百度超链接：文本形式
driver.find_element(By.XPATH, "//*[text()='百度']").click()
# 5.等待2秒
time.sleep(2)
# 6.退出浏览器
driver.quit()


